#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define F first
#define S second
#define endl '\n'
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
const int N=2e5+10;
int p[N],rp[N];
int e[N],ne[N],h[N],idx;
bool ans[N];
set<int> st[100010];
vector<array<int,3>> que[100010];
void add(int a, int b)
{
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;;
}
void init(int n)
{
	idx=0;
	for(int i=1;i<=n;i++)
	{
		h[i]=-1;
		ans[i]=0;
		que[i].clear();
		st[i].clear();
	}
}
void merge(set<int>& a,set<int>& b)
{
	if(a.size()<b.size())
	{
		swap(a,b);
	}
	for(auto it:b) a.insert(it);
	b.clear(); 
}
void dfs(int u, int fa)
{
	st[u].insert(rp[u]);
	for(int i=h[u];~i;i=ne[i])
	{
		int j=e[i];
		if(j==fa) continue;
		dfs(j,u);
		merge(st[u],st[j]);
	}
	for(auto it:que[u])
	{		
		auto pos = st[u].lower_bound(it[0]);
		if(*pos>=it[0] && *pos<=it[1]) ans[it[2]]=1; 
	} 
}
void solve()
{
	int n,m;
	cin>>n>>m;
	init(n);
	for(int i=1;i<n;i++)
	{
		int u,v;
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	for(int i=1;i<=n;i++) cin>>p[i], rp[p[i]]=i;
	for(int i=1;i<=m;i++)
	{
		int l,r,x;
		cin>>l>>r>>x;
		que[x].push_back({l,r,i});
	}
	dfs(1,-1);
	for(int i=1;i<=m;i++) cout<< (ans[i]==1 ? ("YES\n") : ("NO\n"));
	cout<<endl;

}
int main()
{
	IOS;
	int T=1;
	cin>>T;

	while(T--)
	{
		solve();
	}

	return 0;
}

